﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CoreEveprod
{
	public class IndustryCalcul
	{
		private int ProdEff{ get; set;}
		private double ProdTimeModifier { get; set;}

		#region Construteur
		/// <summary>
		/// 
		/// </summary>
		/// <param name="skillProd"></param>
		public IndustryCalcul(int skillProd)
		{
			ProdEff = skillProd;
		} 

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ptm"></param>
		public IndustryCalcul(double ptm)
		{
			ProdTimeModifier = ptm;
		}
		#endregion

		/// <summary>
		/// Formule de CCP pour calculer le Waste.
		/// </summary>
		/// <param name="quantiteOrigine"></param>
		/// <param name="materielEff"></param>
		/// <param name="wasted"></param>
		/// <returns></returns>
		public int NouvelleQuantite(int quantiteOrigine,int materielEff, bool wasted)
		{
			// Il faut d'abord calculer le Waste.
			// TODO : A remplacer par une valeur venant de la base de donnée.
			const int wasteFactor = 10;

			double nouveauWaste;
			if(materielEff >= 0)
			{
				nouveauWaste =((double)1/(materielEff + 1));
			}
			else
			{
				nouveauWaste = 1 - materielEff;
			}

			double waste = ((double)wasteFactor / 100) * nouveauWaste;

			// Ensuite j'applique la formule de CCP.
			if(wasted)
			{
				return (int)Math.Round(quantiteOrigine * (1.25 - (0.05 * ProdEff)) + (quantiteOrigine * waste), 0, MidpointRounding.AwayFromZero);
			}

			return quantiteOrigine;
		}

		/// <summary>
		/// Méthode pour calculer le temps pour faire la production.
		/// </summary>
		/// <param name="prodEfficiency"></param>
		/// <param name="prodTime"></param>
		/// <param name="prodModifier"></param>
		/// <returns></returns>
		public int NouveauTempsProd(int prodEfficiency, int prodTime, int prodModifier)
		{
			// Nous avons 2 formules pour calculer le nouveau temps de production.
			double tempTime;
			if(prodEfficiency >= 0)
			{
				tempTime = prodTime * (1 - (prodModifier / prodTime) * (prodEfficiency / (1 + prodEfficiency)))
				*ProfilProvider.GetProfil().ProductionTimeModifier;
			}
			else
			{
				tempTime = Math.Round(prodTime * (1 - (prodModifier / prodTime) * (prodEfficiency - 1)) *
				            ProfilProvider.GetProfil().ProductionTimeModifier, MidpointRounding.AwayFromZero);
			}

			return (int)tempTime;
		}
	}
}
